﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ApplicationGenerator.CommonModule
{
    /// <summary>
    /// Klasa zawierająca konfigurację projektu
    /// </summary>
    public static class ProjectConfiguration
    {
        /// <summary>
        /// Flaga, czy projekt został poprawnie skonfigurowany
        /// </summary>
        private static bool _isProjectConfigured;

        /// <summary>
        /// Nazwa katalogu ze skompilowanymi przepływami
        /// </summary>
        private const string WorkflowLibrariesDirectoryName = "WorkflowDirectory";

        /// <summary>
        /// Nazwa katalogu ze skomipowanymi klientami do web serwisów
        /// </summary>
        private const string WebServicesAssembliesDirectoryName = "WebServicesAssemblies";

        /// <summary>
        /// Nazwa pliku z konfiguracją dla klientów web serwisów
        /// </summary>
        private const string WebServicesAssembliesConfigurationFileName = "WebServicesAssemblies.config";

        /// <summary>
        /// Definicja pustego pliku konfiguracyjnego
        /// </summary>
        private static string NewConfigurationFileDefinition =
            @"<?xml version=""1.0"" encoding=""utf-8"" ?>
                <configuration>
                  <appSettings>
                  </appSettings>
                </configuration>";

        /// <summary>
        /// Ścieżka do katalogu konfiguracji projektu
        /// </summary>
        public static string ProjectDirectoryPath;

        /// <summary>
        /// Ustawia konfigurację dla projektu, jeśli jeszcze nie jest wykonana
        /// </summary>
        public static void SetUpProjectConfiguration()
        {
            if (_isProjectConfigured)
            {
                return;
            }

            if (string.IsNullOrEmpty(ProjectDirectoryPath))
            {
                throw new ProjectConfigurationException("Należy podać ścieżkę do katalogu z konfiguracją projektu");
            }

            if (!Directory.Exists(ProjectDirectoryPath))
            {
                throw new ProjectConfigurationException("Ścieżka do katalogu z konfiguracją projektu jest nieprawidłowa");
            }

            if (!Directory.Exists(Path.Combine(ProjectDirectoryPath, WorkflowLibrariesDirectoryName)))
            {
                try
                {
                    Directory.CreateDirectory(Path.Combine(ProjectDirectoryPath, WorkflowLibrariesDirectoryName));
                }
                catch (Exception ex)
                {
                    throw new ProjectConfigurationException(string.Format("Nie można utworzyć katalogu {0}", Path.Combine(ProjectDirectoryPath, WorkflowLibrariesDirectoryName)), ex);
                }
            }

            if (!Directory.Exists(Path.Combine(ProjectDirectoryPath, WebServicesAssembliesDirectoryName)))
            {
                try
                {
                    Directory.CreateDirectory(Path.Combine(ProjectDirectoryPath, WebServicesAssembliesDirectoryName));
                }
                catch (Exception ex)
                {
                    throw new ProjectConfigurationException(string.Format("Nie można utworzyć katalogu {0}", Path.Combine(ProjectDirectoryPath, WebServicesAssembliesDirectoryName)), ex);
                }
            }

            if (!File.Exists(GetWebServicesAssembliesConfigurationFile()))
            {
                try
                {
                    File.WriteAllText(GetWebServicesAssembliesConfigurationFile(), NewConfigurationFileDefinition);
                }
                catch (Exception ex)
                {
                    throw new ProjectConfigurationException(string.Format("Nie można zapisać pliku {0}", Path.Combine(Path.Combine(ProjectDirectoryPath, WebServicesAssembliesDirectoryName), WebServicesAssembliesConfigurationFileName)), ex);
                }
            }

            _isProjectConfigured = true;
        }

        /// <summary>
        /// Pobiera ścieżkę do katalogu ze skompilowanymi klientami do web serwisów
        /// </summary>
        /// <returns>Ścieżka do katalogu ze skompilowanymi klientami do web serwisów</returns>
        public static string GetWebServicesAssembliesPath()
        {
            return Path.Combine(ProjectDirectoryPath, WebServicesAssembliesDirectoryName);
        }

        /// <summary>
        /// Pobiera ścieżkę do pliku konfiguracyjnego dla klientów do web serwisów
        /// </summary>
        /// <returns>Ścieżka do pliku konfiguracyjnego dla klientów do web serwisów</returns>
        public static string GetWebServicesAssembliesConfigurationFile()
        {
            return Path.Combine(Path.Combine(ProjectDirectoryPath, WebServicesAssembliesDirectoryName), WebServicesAssembliesConfigurationFileName);
        }

        /// <summary>
        /// Sprawdza, czy projekt został skonfigurowany
        /// </summary>
        /// <returns>Cyz projekt został skonfigurowany ?</returns>
        public static bool IsProjectConfigured()
        {
            return _isProjectConfigured;
        }
    }
}
